/*
 * V93.H Version 1.01 (C)1995,1996 HUDSON SOFT
 * ＣＰＵ・システム関連 Ｃコンパイラ用ヘッダーファイル(V93.H)
 */
#ifndef _V93_H_
#define _V93_H_

#include	<system.h>

/* ＣＰＵ インタラプト コントロール */
void irq_enable(void);
void irq_disable(void);
void set_irq_level( int irq_level );
void set_irq_mask( u_short mask );
void reset_irq_mask( u_short mask );
void set_irq_prio( int prio, int device_no );
void set_irq_vector( void (*handler)(),int vector_no );
/* priority */
#define IRQ_PRIOF	7
#define IRQ_PRIOE	6
#define IRQ_PRIOD	5
#define IRQ_PRIOC	4
#define IRQ_PRIOB	3
#define IRQ_PRIOA	2
#define IRQ_PRIO9	1
#define IRQ_PRIO8	0
/* vector */
#define IRQ_LEVELF	0
#define IRQ_LEVELE	1
#define IRQ_LEVELD	2
#define IRQ_LEVELC	3
#define IRQ_LEVELB	4
#define IRQ_LEVELA	5
#define IRQ_LEVEL9	6
#define IRQ_LEVEL8	7
#define IRQ_73          0
#define IRQ_EXT         0
#define IRQ_70B         1
#define IRQ_KING        2
#define IRQ_70A         3
#define IRQ_KP          4
#define IRQ_FDC         5
#define IRQ_TIMER       6
#define IRQ_TRAP1X      8
#define SOFT_RESET      9
#define MATH_ERR        12

/* キャッシュコントロール */
void cache_enable(void);
void cache_disable(void);
void cache_clear(void);

/* メモリー管理 */
void init_get_mem(void *top,int size);
void *get_mem(void *top,int size);
void *resize_mem(void *top, void *ptr, int newsize);
int free_mem(void *top, void *ptr);

/* キーパッド */
void init_get_pad( void );
void interrupt int_pad( void );
void interrupt int_pado( void );
void get_pad( void );
void set_get_pad_mode( int port_no, int mode, int no_of_pad );
void init_reset_check( int padid, short delay );
int reset_check( void );
void soft_reset( void );

struct KEYDATA {u_int KD_INT,KD_DAT,KD_TRG,KD_OUT;};
extern zero u_short padS0,padC0,padS1,padC1;
extern zero struct KEYDATA pad00;
extern zero struct KEYDATA pad01;
extern zero struct KEYDATA pad02;
extern zero struct KEYDATA pad03;
extern zero struct KEYDATA pad04;
extern zero struct KEYDATA pad05;
extern zero struct KEYDATA pad10;
extern zero struct KEYDATA pad11;
extern zero struct KEYDATA pad12;
extern zero struct KEYDATA pad13;
extern zero struct KEYDATA pad14;
extern zero struct KEYDATA pad15;

#define KC_IN		0x4000
#define KC_OUT		0x2000
#define KC_TAP		0x8000

#define KP_1		0x0001
#define KP_2		0x0002
#define KP_3		0x0004
#define KP_4		0x0008
#define KP_5		0x0010
#define KP_6		0x0020
#define KP_select	0x0040
#define KP_run		0x0080
#define KP_up		0x0100
#define KP_right	0x0200
#define KP_down		0x0400
#define KP_left		0x0800

/* タイマー */
#define _put_timer_tcr(x) __OUTPORTH(IO_TIMER_TCR,x)
#define _put_timer_tmr(x) __OUTPORTH(IO_TIMER_TMR,x)
#define _get_timer_dwc() __INPORTH(IO_TIMER_DWC)

void init_timer( void );

void start_timer(u_short interval,int irqsw);
#define TIMER_IRQ_OFF 0		/* timer irq disable */
#define TIMER_IRQ_ON 1		/* timer irq enable */

void stop_timer(void);

void fill_mram( int sadr, int value, int len );

void init_reg_set_tb( int *queue_tbl, int table_length );
void reg_set( int *queue_tbl, u_short *ar_adr );
void reg_setb( int *queue_tbl, u_short *io_base_adr );
int req_reg_set( int *queue_tbl, int regno, int data, int size );
int req_reg_setb( int *queue_tbl, int regofs, int data );

#endif /* _V93_H_ */
